package com.mall.order.biz.factory;

import com.mall.order.biz.context.CancelOrderContext_X;
import com.mall.order.biz.context.TransHandlerContext;
import com.mall.order.biz.convert.CancelOrderConverter;
import com.mall.order.biz.convert.TransConvert;
import com.mall.order.biz.handler.BackStockHandler;
import com.mall.order.biz.handler.TransPipeline;
import com.mall.order.biz.handler.UpdateOrderInfHandler;
import com.mall.order.dto.CancelOrderRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author XuBang
 * @TODO: 自定义一个pipeline工厂：CancelOrderPipelineFactory_X  实现取消订单功能
 * 0.extends AbstranctTransPipelineFactory  传入request对应的泛型   重写具体的方法
 * 1.注入基本的handler依赖
 * 2.提供context产品
 * 3.将handler尾插法排序
 * 4.定义转化器
 * @date 2021/11/2$
 * @trainOfthought:
 */
@Slf4j
@Service
public class CancelOrderPipelineFactory_X extends AbstranctTransPipelineFactory<CancelOrderRequest> {
    /**
     * 1.注入基本的handler依赖
     * 分析：取消订单
     * （1）从订单表tb_order中删除一个对应的订单id     or    将订单表tb_order中的status改为“5交易关闭”(采取后者)
     * （2）将订单商品关联表tb_order_item中的status改为“2库存已释放”
     * （3）将tb_stock中“冻结库存数量lock_count”归还给“库存数量stock_count”
     */

    /**
     * （1）从订单表tb_order中删除一个对应的订单id     or    将订单表tb_order中的status改为“5交易关闭”(采取后者)
     * （2）将订单商品关联表tb_order_item中的status改为“2库存已释放”
     */
    @Autowired
    UpdateOrderInfHandler updateOrderInfHandler;

    /**
     * （3）将tb_stock中“冻结库存数量lock_count”归还给“库存数量stock_count”
     */
    @Autowired
    BackStockHandler backStockHandler;



    /**
     * 2.提供context产品
     * context:至少应该包含：订单id，商品id两个部分   方便UpdateOrderInfHandler和BackStockHandler，根据这两个id，进行CRUD
     * 目前为止：OrderItem中包含着两个数据   但；OrderItem中的其他数据，怎么赋值？可以在具体的mapper中，根据需求进行赋值；类似createOrder部分
     * 自定义一个context产品
     * @return
     */
    @Override
    protected TransHandlerContext createContext() {
        CancelOrderContext_X cancelOrderContext_x = new CancelOrderContext_X();
        return cancelOrderContext_x;
    }

    /**
     * 3.将handler尾插法排序：先执行update，在执行back
     * @param pipeline
     */
    @Override
    protected void doBuild(TransPipeline pipeline) {
        pipeline.addLast(updateOrderInfHandler);
        pipeline.addLast(backStockHandler);
    }

    /**
     * 4.定义转化器:将request转化为cancelOrderContext_x    将cancelOrderContext_x转化为response
     * @return
     */
    @Override
    protected TransConvert createConvert() {
        return new CancelOrderConverter();
    }
}
